﻿#define _CRT_SECURE_NO_WARNINGS 1
//#include <stdio.h>
//#include <stdlib.h>
//#include <limits.h>
//void test()
//{
//	int* p = (int*)malloc(INT_MAX / 4);
//	//开辟完新空间之后，如果要使用我们就得先检查是否为空指针
//	if (p != NULL)
//	{
//		*p = 20;//如果p的值是NULL，就会有问题
//	}
//	free(p);
//}
//
//int main()
//{
//	test();
//	return 0;
//}


//牛客网每日一题
//#include <stdio.h>
//int main()
//{
//    int a = 0, b = 0, sum = 0;
//    scanf("%d%d", &a, &b);
//    for (int i = a; i <= b; i++)
//    {
//        int flag = 0;
//        for (int j = 2; j < i; j++)
//        {
//            if (i % j == 0)
//            {
//                flag = 1;
//                break;
//            }
//        }
//        if (flag == 0)
//        {
//            sum += i;
//        }
//    }
//    printf("%d\n", sum);
//    return 0;
//}


//void test()
//{
//	int i = 0;
//	int* p = (int*)malloc(10 * sizeof(int));
//	if (NULL == p)
//	{
//		return;
//	}
//	for (i = 0; i <= 10; i++)
//	{
//		*(p + i) = i;//当i是10的时候越界访问
//	}
//	free(p);
//}


//void test()
//{
//	int a = 10;
//	int* p = &a;
//	free(p);
//}


//void test()
//{
//	int* p = (int*)malloc(100);
//	p++;
//	free(p);//p不再指向动态内存的起始位置
//}


//void test()
//{
//	int* p = (int*)malloc(100);
//	free(p);
//	//重复释放,如果我们把这个p置为空指针，那么就不会报错了
//	free(p);
//}


//void test()
//{
//	int* p = (int*)malloc(100);
//	if (NULL != p)
//	{
//		*p = 20;
//	}//没有free
//}
//int main()
//{
//	test();
//	//这个在执行死循环，就导致这个程序不会停下来，
//	//那么这个动态开辟的内存不会被销毁
//	while (1)
//	{
//		;
//	}
//	return 0;
//}


//void GetMemory(char* p)
//{
//	p = (char*)malloc(100);
//}
//void Test(void)
//{
//	char* str = NULL;
//	//这个是传值调用，而不是传址调用，所以这个str还是空指针
//	//一级指针的地址使用二级指针来接收
//	GetMemory(str);
//	strcpy(str, "hello world");
//	printf(str);
//}


//char* GetMemory(void)
//{
//	char p[] = "hello world";
//	return p;
//}
//void Test(void)
//{
//	char* str = NULL;
//	//p是一个局部变量，有自己的作用域，当出了这个GetMemory函数就会被销毁
//	str = GetMemory();
//	//这里通过str找到属于p之前的那份空间，但是内容已经不是原来的内容了
//	printf(str);
//}


//void GetMemory(char** p, int num)
//{
//	*p = (char*)malloc(num);
//}
//void Test(void)
//{
//	char* str = NULL;
//	GetMemory(&str, 100);
//	strcpy(str, "hello");
//	printf(str);
//	//最后忘记把内存释放了，导致了内存泄露
//}

//#include <stdio.h>
//#include <stdlib.h>
//#include <string.h>
//void Test(void)
//{
//	char* str = (char*)malloc(100);
//	strcpy(str, "hello");
//	free(str);//这个空间被提前释放了，但是没有被置空。
//	//因此可以进去if语句
//	if (str != NULL)
//	{
//		//这块地址还没有被使用，所以就会打印出world
//		strcpy(str, "world");
//		printf(str);
//	}
//}
//
//int main()
//{
//	Test();
//	return 0;
//}


//给室友写的代码
//#include <stdio.h>
//int main()
//{
//	int arr[4][3] = { 0 };
//	for (int i = 0; i < 4; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			scanf("%d", &arr[i][j]);
//		}
//	}
//	int max = arr[0][0];
//	int row = 0, col = 0;
//	for (int i = 0; i < 4; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			if (arr[i][j] > max)
//			{
//				max = arr[i][j];
//				row = i;
//				col = j;
//			}
//		}
//	}
//	printf("max=%d, row=%d, col=%d\n", max, row+1, col+1);
//	return 0;
//}


//typedef struct st_type
//{
//	int i;
//	int a[0];//柔性数组成员
//}type_a;
//
////有些编译器会报错⽆法编译可以改成：
//typedef struct st_type
//{
//	int i;
//	int a[];//柔性数组成员
//}type_a;


//#include <stdio.h>
//typedef struct st_type
//{
//	int i;
//	int a[0];//柔性数组成员
//}type_a;

//int main()
//{
//	printf("%zd\n", sizeof(type_a));//输出的是4,也就是只有i的大小
//	return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//typedef struct st_type
//{
//	int i;
//	int a[0];//柔性数组成员
//}type_a;
//
//int main()
//{
//	//							原来的大小        柔性数组的大小
//	type_a* p = (type_a*)malloc(sizeof(type_a) + 100 * sizeof(int));
//	
//	p->i = 100;
//	for (int i = 0; i < 100; i++)
//	{
//		p->a[i] = i;
//	}
//	free(p);
//	return 0;
//}


//#include <stdio.h>
//#include <stdlib.h>
//typedef struct st_type
//{
//	int i;
//	int* p_a;
//}type_a;
//int main()
//{
//	type_a* p = (type_a*)malloc(sizeof(type_a));
//	p->i = 100;
//	//p_a指向一个100个整形的空间的地址
//	p->p_a = (int*)malloc(p->i * sizeof(int));
//
//	for (int i = 0; i < 100; i++)
//	{
//		p->p_a[i] = i;
//	}
//
//	//释放空间
//	free(p->p_a);
//	p->p_a = NULL;
//	free(p);
//	p = NULL;
//	return 0;
//}